package com.thread.sync.sync06;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

/**
 * 构造FutureTask时使用Callable接口，告诉FutureTask我们需要的数据应该有返回值。
 * 然后将FutureTask提交给线程池，接下来我们不用关心数据是怎么产生的，可以去做其他的业务逻辑处理，
 * 然后在需要的时候调用FutureTask.get()得到实际的数据
 */
public class Test01 {
    public static void main(String[] args) throws Exception {
        //构造FutureTask
        FutureTask<String> futureTask = new FutureTask<String>(new RealData("xxx"));
        ExecutorService executorService = Executors.newFixedThreadPool(1);
        //执行FutureTask，发送请求
        //在这里开启线程进行RealData的call()执行
        executorService.submit(futureTask);

        System.out.println("请求完毕。。。");
        try {
            //这里可以进行其他额外的操作，这里用sleep代替其他业务的处理
            Thread.sleep(200);
            System.out.println("我在处理其他事情....");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //获取call()方法的返回值
        //如果此时call()方法没有执行完成，则依然会等待
        System.out.println("我要获取真实数据:" + futureTask.get());
    }

}
